package 变长滑动窗口1

func longestSubarray(nums []int) (ans int) {
	cnt0, left := 0, 0
	for right, x := range nums {
		cnt0 += 1 - x
		for cnt0 > 1 {
			cnt0 -= 1 - nums[left]
			left++
		}
		ans = max(ans, right-left)
	}
	return
}

//func longestSubarray(nums []int) int {
//	n := len(nums)
//	left := 0      // 窗口左边界
//	maxLen := 0    // 最长有效子数组长度
//	zeroCount := 0 // 窗口内0的数量（最多允许1个）
//
//	// 右指针遍历数组，扩展窗口
//	for right := 0; right < n; right++ {
//		// 新元素是0，更新计数
//		if nums[right] == 0 {
//			zeroCount++
//		}
//
//		// 若0的数量超过1，收缩左边界，直到0的数量≤1
//		for zeroCount > 1 {
//			// 左边界元素是0，离开窗口时计数减1
//			if nums[left] == 0 {
//				zeroCount--
//			}
//			left++ // 左指针右移，缩小窗口
//		}
//
//		// 当前窗口[left, right]是有效窗口（0的数量≤1）
//		// 窗口长度为right-left+1，但需注意：题目要求必须删除一个元素
//		// 若窗口内有0，则删除0后长度为right-left；若全是1，则删除一个1后长度为right-left
//		currentLen := right - left
//		maxLen = max(maxLen, currentLen)
//	}
//
//	return maxLen
//}
